package com.lxb.myforum.service

import java.util.stream.Collectors

import com.lxb.myforum.base.BaseService
import com.lxb.myforum.domain.ResResult
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.data.domain.Page
import org.springframework.data.domain.Pageable
import org.springframework.stereotype.Service

import com.lxb.myforum.pojo.Resource
import com.lxb.myforum.repository.ResourceRepository
import com.lxb.myforum.service.spec.ResourceSpec

/**
 *
 * @author lxb
 */
@Service
class ResourceService @Autowired
constructor(private val resourceRepository: ResourceRepository) : BaseService() {

    /**
     * 查询所有的Resource，分页+排序
     * @param pageable 分页信息
     * @return 分页结果
     */
    fun getResources(pageable: Pageable): Page<Resource> {
        return resourceRepository.findAll(pageable)
    }

    /**
     * 根据条件查询
     * @param pageable 分页信息
     * @param resource 资源信息
     * @return 分页获取的结果
     */
    fun getResources(pageable: Pageable, resource: Resource): Page<Resource> {
        return resourceRepository.findAll(ResourceSpec(resource), pageable)
    }

    /**
     * 根据条件查询一条记录
     * @param resource 查询的资源条件
     * @return 根据条件获取的一条资源信息
     */
    fun findOneRes(resource: Resource): Resource {
        return resourceRepository.findOne(ResourceSpec(resource)).orElse(null)
    }

    /**
     * 根据id 查询一条记录
     * @param id 要查询的资源id
     * @return 查询的资源结果
     */
    fun findById(id: Long): Resource {
        return resourceRepository.findById(id).orElse(null)
    }

    /**
     * 新增或者更新数据
     * @param resource 要保存的Resource
     * @return [Resource]
     */
    fun saveRes(resource: Resource): Resource = resourceRepository.save(resource)

    /**
     * 根据id删除对应的Resource
     * @param id 要删除的资源ID
     * @return 删除结果
     */
    fun deleteResById(id: Long): ResResult {
        val rr = ResResult("delete")

        // 只会删除该id的Resource和与该Resource相关的联系（如果是多对多，即是第三张表的数据【两者之间的联系】）
        // 并不会删除与该Resource相关连的表的信息
        try {
            resourceRepository.deleteById(id)
            rr.isSuccess = true
        } catch (e: IllegalArgumentException) {
            rr.isSuccess = false
            rr.msg = e.message
        }

        return rr
    }

    /**
     * 批量删除数据
     * @param ids 要删除的资源ID集合
     * @return 返回删除结果
     */
    fun delResByIds(ids: List<Long>): ResResult {
        val rr = ResResult("delete")

        val roles = ids.stream().map<Resource> { Resource(it) }.collect(Collectors.toList())
        try {
            resourceRepository.deleteAll(roles)
            rr.isSuccess = true
        } catch (e: IllegalArgumentException) {
            rr.isSuccess = false
            rr.msg = e.message
        }

        return rr
    }
}
